3,846,550 members and growing!   9,907 now online. Dali Hammadi | My Settings | My Bookmarks | My Articles | Sign out
All Topics, C#, .NET >> C# Algorithms >> Unedited Reader Contributions  (Advanced)

Photometric Normalisation Algorithms
By mosquets.

Pre-processing faces images in order to increase the performance of verification and recognition algorithms
Generic
Windows
Win32, VS
Dev
Posted: 14 Nov 2006
Views: 2,185
Note: This is an unedited reader contribution Modify | Delete 
Announcements


Search    
Advanced Search
Sitemap
Print Broken Article? Bookmark Discuss Send to a friend
14 votes for this article.
Popularity: 3.15. Rating: 2.75 out of 5.

Note: This is an unedited contribution. If this article is inappropriate, needs attention or copies someone else's work without reference then please Report this article.

Sample Image - normalisation_algorithms.jpg

Output of multiscale retinex algorithm.

Introduction

The variation of illumination conditions of an object can produce large changes in the image plane, significantly impairing the performance of face verification and recognition algorithms. I present three photometric normalisation algorithms for use in pre-processing face images in order to be used in verification and recognition algorithms. Mainly I follow the ideas of paper "A Comparison of Photometric Normalisation Algorithms for Face Verification",James Short, Josef Kittler and Kieron Messer(2004) and "Lighting Normalization Algorithms for Face Verification",Guillaume Heusch ,Fabien Cardinaux, Sebastien Marcel(2005). Multiscale retinex method is coded exactly like the theory say. The anisotropic and isotropic smoothing methods have a little modifications but essentially its are the same. If you want to see more details about them you can see the papers previusly mentionated.

Using the code

You can apply the multiscale retinex method like:
        MultiscaleRetinex retinex = new MultiscaleRetinex(param.Sigmas, param.Widths, param.FilterSize);
        picFiltered.Image = retinex.Apply((Bitmap)bitmap.Clone());
This is the code of multiscale retinex algorithm:
        public override unsafe Bitmap Apply(Bitmap bitmap)
        {
            int count = sigmas.Length;
            Bitmap bmp;
            double[,] sum = new double[bitmap.Width, bitmap.Height];
            
            for (int i = 0; i < count;i++ )
            {
                bmp = new GaussianBlur(sigmas[i], size).Apply(bitmap);
                sum = SumBitmap(bmp,sum,widths[i]);
            }
            return Normalise(DivBitmap(bitmap, sum));
        }
You can apply the isotropic smoothing method like:
        IsotropicSmoothing iso = new IsotropicSmoothing(param.Value);
        picFiltered.Image = iso.Apply((Bitmap)bitmap.Clone());
This is the code of isotropic smoothing algorithm:
        public override unsafe Bitmap Apply(Bitmap bitmap)
        {
            Bitmap = bitmap;
            Point size = PixelSize;
            double[,] src = new double[size.X, size.Y];
            bool first = true;
            byte N, S, E, W, A;
            double Lw, Le, Ls, Ln, tmp, min = 0, max = 0;

            LockBitmap();

            for (int y = 0; y < size.Y ; y++)
            {
                PixelData* pPixel = PixelAt(0, y);
                for (int x = 0; x < size.X ; x++)
                {
                    tmp = pPixel->gray;

                    //Applying the process to all pixels of image except to the borders
                    if ((x > 0) && (x < size.X-1) && (y > 0) && (y < size.Y-1))
                    {
                        //Adjacent neighbouring pixels
                        A = pPixel->gray;           //current
                        E = PixelAt(x, y+1)->gray;  //east 
                        S = PixelAt(x+1, y)->gray;  //south 
                        N = PixelAt(x-1, y)->gray;  //north 
                        W = PixelAt(x, y-1)->gray;  //west  

                        //Ld refers to the derivative with respect to 
                        //each of the four adjacent neighbouring pixels
                        Lw = A - W;
                        Le = A - E;
                        Ln = A - N;
                        Ls = A - S;

                        //Isotropic smoothing
                        tmp = A + smooth * (Ln + Ls + Le + Lw);
                    }

                    src[x, y] = tmp;

                    //Computing the min and max values from all pixels of image
                    if (first) { min = max = tmp; first = false; }
                    else
                    {
                        if (tmp < min) min = tmp;
                        else
                            if (tmp > max) max = tmp;
                    }
                    pPixel++;
                }
            }
            UnlockBitmap();
            return Normalise(src, min, max);
        }

Sample Image - example_isotropic.jpg

Output of isotropic smoothing algorithm.

You can apply the anisotropic smoothing method like:
        AnisotropicSmoothing anis = new AnisotropicSmoothing(param.Value);
        picFiltered.Image = anis.Apply((Bitmap)bitmap.Clone()); 
This is the code of anisotropic smoothing algorithm:
        public override unsafe Bitmap Apply(Bitmap bitmap) 
        {
            Bitmap = bitmap;
            Point size = PixelSize;
            double[,] src = new double[size.X,size.Y];
            bool first = true;
            byte N, S, E, W, A;
            double Lw, Le, Ls, Ln, pw, pe, ps, pn, eps = .1, tmp, min = 0, max = 0;
            
            LockBitmap();
            
            for (int y = 0; y < size.Y; y++)
            {
                PixelData* pPixel = PixelAt(0, y);
                for (int x = 0; x < size.X; x++)
                {
                    tmp = pPixel->gray;

                    //Applying the process to all pixels of image except to the borders
                    if ((x > 0) && (x < size.X-1) && (y > 0) && (y < size.Y-1))
                    {
                        //Adjacent neighbouring pixels
                        A = pPixel->gray;           //current
                        E = PixelAt(x, y+1)->gray;  //east 
                        S = PixelAt(x+1, y)->gray;  //south 
                        N = PixelAt(x-1, y)->gray;  //north 
                        W = PixelAt(x, y-1)->gray;  //west  

                        //Ld refers to the derivative with respect to 
                        //each of the four adjacent neighbouring pixels
                        Lw = A - W;
                        Le = A - E;
                        Ln = A - N;
                        Ls = A - S;

                        //Weber’s contrast inverse
                        pw = Math.Min(A, W) / (Math.Abs(A - W) + eps);
                        pe = Math.Min(A, E) / (Math.Abs(A - E) + eps);
                        pn = Math.Min(A, N) / (Math.Abs(A - N) + eps);
                        ps = Math.Min(A, S) / (Math.Abs(A - S) + eps);

                        //Anisotropic smoothing
                        tmp = A + smooth * (Ln * pn + Ls * ps + Le * pe + Lw * pw);
                    }

                    src[x, y] = tmp;

                    //Computing the min and max values from all pixels of image
                    if (first) { min = max = tmp; first = false; }
                    else
                    {
                        if (tmp < min) min = tmp;
                        else
                            if (tmp > max) max = tmp;
                    }
                    pPixel++;
                }
            }
            UnlockBitmap();
            return Normalise(src,min, max);
        }

Sample Image - example_anisotropic.jpg

Output of anisotropic smoothing algorithm.

Versions

1.0 14 Nov 2006

Credits

  • Dr. Eduardo Garea(Adviser)
  • Dr. Edel García(Adviser)
  • Andrew Kirillov's Image Processing Lab in C#

    Points of interest

    Image Processing in general (filtering,enhancement,denoisy etc.),C#, ASP.NET, Matlab, Java.

  • mosquets


    Click here to view mosquets's online profile.


    Other popular C# Algorithms articles:

    [Top] Rate this Article for us!     PoorExcellent  
     
    FAQ  Message score threshold    Search comments  
      View    Per page  
    New Message Msgs 1 to 4 of 4 (Total: 4) (Refresh) First Prev Next     
    Subject  Author  Date 
      Color Image   japacheco  16:43 22 Jan '07 
      Re: Color Image   mosquets  10:05 23 Jan '07 
      How can I enhance the original image by the output of Multi Scale Retinex?   Brian Lau  1:54 4 Dec '06 
      Re: How can I enhance the original image by the output of Multi Scale Retinex?   mosquets  10:17 4 Dec '06 
    Last Visit: 7:21 Sunday 3rd December, 2006 First Prev Next     

    General comment    News / Info    Question    Answer    Joke / Game    Admin message


    Updated: 14 Nov 2006 Article content copyright mosquets, 2006
    everything else Copyright © CodeProject, 1999-2007.
    Web20 | Advertise on The Code Project | Privacy

    The Ultimate Toolbox • ASP Alliance • Developer Fusion • Developersdex • DevGuru • Programmers Heaven • Planet Source Code • Tek-Tips Forums •